ANTLR 4词法

1 词法

(1) 注释

遵循Java形式的注释。

只用于语法和规则的前面。

分为单行和多行两种。

(2) 识别符(Identifier)

标识和词法规则使用大写字母开头,通过Java的Character.isUpperCase方法定义。

解析规则名称使用小写字母开头。

首字符可以是大小写字母、数字和下划线。

ANTLR名称也可以是Unicode编码,如汉字。

1
2
3
4
5
6
ID, LPAREN, RIGHT_CURLY // token names/lexer rules
expr, simpleDeclarator, d2, header_file // parser rule names

// Unicode
grammar 外;
a: ‘外’;

ANTLR使用以下规则支持Unicode的解析和词法规则名称。

1
2
3
4
5
6
ID : a=NameStartChar NameChar*
{
if ( Character.isUpperCase(getText().charAt(0)) ) setType(TOKEN_REF);
else setType(RULE_REF);
}
;

NameChar定义有效的识别字符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fragment
NameChar
: NameStartChar
| '0'..'9'
| '_'
| '\u00B7'
| '\u0300'..'\u036F'
| '\u203F'..'\u2040'
;
fragment
NameStartChar
: 'A'..'Z' | 'a'..'z'
| '\u00C0'..'\u00D6'
| '\u00D8'..'\u00F6'
| '\u00F8'..'\u02FF'
| '\u0370'..'\u037D'
| '\u037F'..'\u1FFF'
| '\u200C'..'\u200D'
| '\u2070'..'\u218F'
| '\u2C00'..'\u2FEF'
| '\u3001'..'\uD7FF'
| '\uF900'..'\uFDCF'
| '\uFDF0'..'\uFFFD'
;

使用非UTF-8编码的文件时,需要指定-encoding选项。

(3) 字面量

使用单引号'表示字面量。

不区分字符和字符串字面量。

字面量不能包含正则。

可以使用Unicode转义字符。

可以使用常见的逃逸符,如\n、\r、\t、\b、\f等。

输入文件的编码默认使用目标语言的的运行时库的配置,如Java使用UTF-8。

(4) 动作

动作使用花括号包含目标语言的代码块。

内嵌代码可以出现在@header和@member修饰的动作、解析器、词法规则、异常捕获、解析器规则的属性模块和一些规则元素选项(当前仅predicates)。

ANTLR只解析与语法属性相关的部分,即使是动作内部的词法规则也不会解析。

(5) 关键字

保留关键字包括:

1
2
import, fragment, lexer, parser, grammar, returns,
locals, throws, catch, finally, mode, options, tokens

注意:虽然rule不是关键字,但是不建议用作规则名称。

此外,不建议使用目标语言的关键字作为名称,以避免歧义。

参考资料